`
https://leetcode.cn/problems/next-permutation/
`

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var nextPermutation = function (nums) {
  // 从后找到第一个比下一个数小的数
  let i = nums.length - 2
  while (i >= 0 && nums[i] >= nums[i + 1]) i--;
  // 如果没找到，直接翻转整个数组
  if (i === -1) return nums.reverse();
  // 从后找到第一个比刚才找到数字更大的数
  let j = nums.length - 1
  while (j >= 0 && nums[j] <= nums[i]) j--;
  // 交换两个数的位置
  swap(nums, i, j)
  // 翻转 i 后面的部分
  reverse(nums, i + 1, nums.length - 1)
};

function swap(arr, i, j) {
  [arr[i], arr[j]] = [arr[j], arr[i]]
}

function reverse(arr, i, j) {
  while (i < j) {
    swap(arr, i, j)
    i++
    j--
  }
}
